function ReadABAQUSFile(fileName::String)

    nodes = Matrix{Float64}(undef, 0, 3)
    physicalSurfaceElements = Dict{String,Vector{Vector{Int64}}}()
    physicalCurveElements = Dict{String,Vector{Vector{Int64}}}()
    physicalVolumeElements = Dict{String,Vector{Vector{Int64}}}()
    volumeElements = Dict{String,Vector{Vector{Int64}}}()
    faceElements = Dict{String,Vector{Vector{Int64}}}()
    lineElements = Dict{String,Vector{Vector{Int64}}}()
    io = open(fileName, "r")
    flag = ""
    while !eof(io)
        x = readline(io)
        if x == "*NODE"
            flag = "NODE"
            x = readline(io)
        elseif (p = findfirst("ELSET=Line", x)) !== nothing
            flag = "Line" * x[p[end]+1:end]
            x = readline(io)
            lineElements[flag] = Vector{Int64}[]
        elseif (p = findfirst("ELSET=Surface", x)) !== nothing
            flag = "Surface" * x[p[end]+1:end]
            x = readline(io)
            faceElements[flag] = Vector{Int64}[]
        elseif (p = findfirst("ELSET=Volume", x)) !== nothing
            flag = "Volume" * x[p[end]+1:end]
            x = readline(io)
            volumeElements[flag] = Vector{Int64}[]
        elseif (p = findfirst("ELSET=PhysicalSurface", x)) !== nothing
            flag = "PhysicalSurface" * x[p[end]+1:end]
            x = readline(io)
            physicalSurfaceElements[flag] = Vector{Int64}[]
        elseif (p = findfirst("ELSET=PhysicalCurve", x)) !== nothing
            flag = "PhysicalCurve" * x[p[end]+1:end]
            x = readline(io)
            physicalCurveElements[flag] = Vector{Int64}[]
        elseif (p = findfirst("ELSET=PhysicalVolume", x)) !== nothing
            flag = "PhysicalVolume" * x[p[end]+1:end]
            x = readline(io)
            physicalVolumeElements[flag] = Vector{Int64}[]
        elseif x == "******* E L E M E N T S *************"
            continue
        end

        if flag == ""
            continue
        end

        if flag == "NODE"
            item = parse.(Float64, split(x, ", "))
            nodes = vcat(nodes, item[2:end]')
        elseif flag[1:4] == "Line"
            item = parse.(Int64, split(x, ", "))
            push!(lineElements[flag], item)
        elseif flag[1:7] == "Surface"
            item = parse.(Int64, split(x, ", "))
            push!(faceElements[flag], item)
        elseif flag[1:6] == "Volume"
            item = parse.(Int64, split(x, ", "))
            push!(volumeElements[flag], item)
        elseif flag[1:15] == "PhysicalSurface"
            item = parse.(Int64, plit(x, ", "))
            push!(physicalSurfaceElements[flag], item)
        elseif flag[1:14] == "PhysicalVolume"
            item = parse.(Int64, split(x, ", "))
            push!(physicalVolumeElements[flag], item)
        elseif flag[1:13] == "PhysicalCurve"
            item = parse.(Int64, split(x, ", "))
            push!(physicalCurveElements[flag], item)
        end
    end
    close(io)
    result = Dict{String,Any}()
    result["nodes"] = nodes
    result["volumeElements"] = volumeElements
    result["faceElements"] = faceElements
    result["lineElements"] = lineElements
    result["physicalSurfaceElements"] = physicalSurfaceElements
    result["physicalVolumeElements"] = physicalVolumeElements
    result["physicalCurveElements"] = physicalCurveElements
    return result
end

meshfile = ReadABAQUSFile("T.inp")
keys(meshfile)

gcoord = meshfile["nodes"][:, 1:2]
numberingData = meshfile["faceElements"]["Surface1"]
gnum = reduce(vcat, numberingData')[:, [2, 5, 3, 6, 4, 7]]